<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Metaprogrammierung</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Metaprogrammierung"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Metaprogrammierung rootpage-Metaprogrammierung skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Metaprogrammierung</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>Metaprogrammierung</b> ist in der Informatik die Erstellung von Computerprogrammen ("Metaprogramme"), die Computerprogramme erzeugen.
</p><p>Das Ziel dabei ist es, den Computer ganz oder teilweise an dem Prozess der Programmierung mitarbeiten zu lassen. Dadurch ist es möglich, Fehler durch Automatisierung zu vermindern und Computerprogramme ad hoc zu erstellen und auszuführen. Metaprogrammierung gestattet es ebenfalls, die Programmiersprache durch den Programmierer um neue Konstruktionen zu erweitern. Daher ist sie in <a href="Homoikonizit%C3%A4t" title="Homoikonizität">homoikonischen</a> Programmiersprachen ein sehr effektives Mittel zur Entwicklung von <a href="Dom%C3%A4nenspezifische_Sprache" title="Domänenspezifische Sprache">Domänenspezifischen Sprachen</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Grundkonzepte">Grundkonzepte</h2></div>
<p>Falls die Programmiersprache <a href="Homoikonizit%C3%A4t" title="Homoikonizität">homoikonisch</a> ist, wie <a href="Lisp" title="Lisp">Lisp</a> und seine Dialekte, kann die Programm-Erzeugung durch das Metaprogramm direkt auf der Ebene der Programmstruktur erfolgen. Falls Homoikonizität nicht gegeben ist, kann die Programmerzeugung aber behelfsweise lexikalisch erfolgen, wobei das Metaprogramm den Quelltext des Zielprogramms erzeugt. In dieser (fehleranfälligeren) Form kann Metaprogrammierung grundsätzlich in jeder Programmiersprache durchgeführt werden.
</p><p>Ein abgeschwächtes Mittel zur Metaprogrammierung ist die <a href="Reflexion_(Programmierung)" title="Reflexion (Programmierung)">Introspektion</a>, bei der die Struktur des Zielprogramms allerdings bereits zum Zeitpunkt der Erstellung des Metaprogramms festliegen muss.
</p><p>Metaprogrammierung ist eine der konzeptionellen Grundlagen des <a href="Compiler" title="Compiler">Programmiersprachen-Compilers</a>. Sie bedient aber auch den Wunsch, adaptive Softwaresysteme zu entwickeln, die sich leicht an sich ändernde Rahmenbedingungen entweder zur <i>Laufzeit</i> oder innerhalb der <i>Entwicklungsphase</i> anpassen können.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Klassifikation">Klassifikation</h2></div>
<p>Metaprogrammierung lässt sich nach verschiedenen Gesichtspunkten einteilen:<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>Nach Bearbeitungszeitpunkt:
</p>
<ul><li>statisch (zur Compiler-Zeit)</li>
<li>dynamisch (zur Laufzeit)</li></ul>
<p>Nach Sprachen:
</p>
<ul><li>homogen (Metasprache ist Objektsprache)</li>
<li>heterogen (sonst)</li></ul>
<p>Nach Stufen:
</p>
<ul><li>mehrstufig (Objektsprache ist selbst Metasprache)</li>
<li>einstufig (sonst)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Beispiele">Beispiele</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Metaprogrammierung_in_homoikonischen_Programmiersprachen">Metaprogrammierung in homoikonischen Programmiersprachen</h3></div>
<p>Das Makrosystem von <a href="Lisp" title="Lisp">Lisp</a> und seinen Dialekten ist aufgrund der Homoikonizität der Sprache das mächtigste derzeit verfügbare Werkzeug zur Metaprogrammierung, da diese hier auf der Ebene der Programmstruktur, technisch also auf dem <a href="Parsebaum" class="mw-redirect" title="Parsebaum">Parsebaum</a>, erfolgt. Dadurch ist es ohne Weiteres möglich, Lisp um neue Kontrollstrukturen zu erweitern, wie die folgende Definition in <a href="Common_Lisp" title="Common Lisp">Common Lisp</a> zeigt, die die <a href="Schleife_(Programmierung)#While-Do-Schleife" title="Schleife (Programmierung)">WHILE-Schleife</a> definiert.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> Eine solche ist in Common Lisp in der üblichen Form nicht enthalten.
</p>
<div class="mw-highlight mw-highlight-lang-lisp mw-content-ltr" dir="ltr"><pre><span></span><span class="p">(</span><span class="nb">defmacro</span><span class="w"> </span><span class="nv">while</span><span class="w"> </span><span class="p">(</span><span class="nb">cond</span><span class="w"> </span><span class="k">&body</span><span class="w"> </span><span class="nv">body</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">((</span><span class="nv">name</span><span class="w"> </span><span class="p">(</span><span class="nb">gensym</span><span class="p">)))</span>
<span class="w"> </span><span class="o">`</span><span class="p">(</span><span class="k">labels</span><span class="w"> </span><span class="p">((</span><span class="o">,</span><span class="nv">name</span><span class="w"> </span><span class="p">()</span>
<span class="w"> </span><span class="p">(</span><span class="k">if</span><span class="w"> </span><span class="o">,</span><span class="nb">cond</span>
<span class="w"> </span><span class="p">(</span><span class="k">progn</span>
<span class="w"> </span><span class="o">,@</span><span class="nv">body</span>
<span class="w"> </span><span class="p">(</span><span class="o">,</span><span class="nv">name</span><span class="p">)))))</span>
<span class="w"> </span><span class="p">(</span><span class="o">,</span><span class="nv">name</span><span class="p">))))</span>
</pre></div>
<p>Diese Definition führt die WHILE-Schleife auf eine <a href="Endrekursion" title="Endrekursion">endständige Rekursion</a> zurück. Im Anschluss kann das neue Sprachkonstrukt direkt verwendet werden:
</p>
<div class="mw-highlight mw-highlight-lang-lisp mw-content-ltr" dir="ltr"><pre><span></span><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">((</span><span class="nv">a</span><span class="w"> </span><span class="mi">0</span><span class="p">))</span>
<span class="w"> </span><span class="p">(</span><span class="nv">while</span><span class="w"> </span><span class="p">(</span><span class="nb"><</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="mi">10</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="nb">print</span><span class="w"> </span><span class="nv">a</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="k">setq</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="p">(</span><span class="nb">1+</span><span class="w"> </span><span class="nv">a</span><span class="p">))))</span>
</pre></div>
<p>Die Ausführung dieses Programms führt dann zu Ausgabe der Zahlen von 0 bis 9.
</p><p><a href="XSL" class="mw-redirect" title="XSL">XSL</a> ist eine der wenigen ebenfalls homoikonischen Programmiersprachen. Sie beschreibt die Transformation von <a href="XML" class="mw-redirect" title="XML">XML</a>-Daten. Dabei ist XSL gleichzeitig valides XML, wodurch die Homoikonizität gegeben ist.
</p>
<div class="mw-heading mw-heading3"><h3 id="Selbstmodifizierender_Code">Selbstmodifizierender Code</h3></div>
<div class="hauptartikel" role="navigation"><span class="hauptartikel-pfeil" title="siehe" aria-hidden="true" role="presentation">→ </span><i><span class="hauptartikel-text">Hauptartikel</span>: <a href="Selbstmodifizierender_Code" title="Selbstmodifizierender Code">Selbstmodifizierender Code</a></i></div>
<p>Schon in frühen Computersystemen wurden bisweilen Programme angewandt, die zur Laufzeit ihre eigene ausführbare (<a href="Maschinensprache" title="Maschinensprache">Maschinensprache</a>-)Repräsentation bearbeiten.
</p>
<div class="mw-heading mw-heading3"><h3 id="Behelfsweise_Metaprogrammierung_in_nicht-homoikonischen_Programmiersprachen">Behelfsweise Metaprogrammierung in nicht-homoikonischen Programmiersprachen</h3></div>
<ul><li>Textmakros in <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> gestatten es, mittels <code>#define</code>, dem C-Compiler einen Quelltext vorzulegen, der durch Makroexpansion entsteht. Das Verfahren war ursprünglich zur Herstellung von inline-Prozeduren gedacht. Es ist astabil und sehr fehleranfällig.</li>
<li><a href="C%2B%2B-Metaprogrammierung" title="C++-Metaprogrammierung">C++-Metaprogrammierung</a> bezeichnet die Technik der Metaprogrammierung innerhalb der Programmiersprache C++.</li>
<li>Noch einfachere Szenarien gehören genau genommen ebenfalls zur Metaprogrammierung, wie zum Beispiel die Erzeugung von <a href="JavaScript" title="JavaScript">JavaScript</a>-Code für den Browser durch ein serverseitiges <a href="PHP" title="PHP">PHP</a>-Skript oder andere Einsatzformen von <a href="Codegenerierung" class="mw-redirect" title="Codegenerierung">Codegenerierung</a>. Dabei kann fast jede Programmiersprache zum Einsatz kommen. Da die Programmerzeugung auch hier auf der Ebene des Quelltextes erfolgt, ist es ebenfalls sehr fehleranfällig.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Metaprogrammierung_in_der_Psychologie">Metaprogrammierung in der Psychologie</h2></div>
<p>Gemäß dem Neurophysiologen <a href="John_Cunningham_Lilly" title="John Cunningham Lilly">John Cunningham Lilly</a> beschreibt Metaprogrammierung die durch <a href="Metakommunikation" title="Metakommunikation">Metakommunikation</a> erfolgende Programmierung des menschlichen <a href="Neuronaler_Erregungskreis" title="Neuronaler Erregungskreis">Biocomputers</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Informatik">Informatik</h3></div>
<ul><li>Patrick M. Krusenotto <i>Funktionale Programmierung und Metaprogrammierung – Interaktiv in Common Lisp</i> Springer-Verlag 2016, ISBN 978-3-658-13743-4</li>
<li>Thomas Maier-Komor: <i>Methoden der Metaprogrammierung zur Rekonfiguration von Software eingebetteter Systeme</i>. Dr. Hut; Auflage: 1. Aufl. (31. Januar 2007). ISBN 978-3899634709</li>
<li>Oliver Vogel, Ingo Arnold, Arif Chughtai, Timo Kehrer: <i>Software Architecture: A Comprehensive Framework and Guide for Practitioners</i>. Springer; Auflage: 2011 (17. September 2011). ISBN 978-3642197352</li></ul>
<div class="mw-heading mw-heading3"><h3 id="Psychologie">Psychologie</h3></div>
<ul><li>John C. Lilly: <i>Programmierung und Metaprogrammierung des menschlichen Biocomputers</i>. Phänomen-Verlag; Auflage: 1., Aufl. (18. April 2010). ISBN 978-3933321688</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://www.infosun.fim.uni-passau.de/cl/lehre/sips1-ss06/Uebung/Metaprogrammierung.pdf">Metaprogrammierung</a> – Skript Kapitel (Uni Passau; PDF, 195 kB)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Doga Arinir: <i>Multidimensionale Separierung der Belange in der Softwareentwicklung durch Feature-Komponenten</i>. W3L GmbH; Auflage: 1 (18. Juli 2007). ISBN 978-3937137537. Seite 50/51</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.infosun.fim.uni-passau.de/cl/lehre/sips1-ss06/Uebung/Metaprogrammierung.pdf">Metaprogrammierung</a> – Skript Kapitel (Uni Passau; PDF, 195 kB)</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text">Patrick M. Krusenotto <i>Funktionale Programmierung und Metaprogrammierung – Interaktiv in Common Lisp</i> Springer-Verlag 2016, ISBN 978-3-658-13743-4. Seite 275</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-06-08" href="https://de.wikipedia.org/wiki/?title=Metaprogrammierung&oldid=256799746">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>